//#pragma 
//
////namespace WX
////{
////	template <class T>
////	struct list_node
////	{
////		struct list_node* _next;
////		struct list_node* _prev;
////		T _data;
////
////		list_node(const T& x = T())
////			:_next(nullptr)
////			,_prev(nullptr)
////			,_data(x)
////		{}
////	};
////
////	template <class T>
////	struct list_terator
////	{
////		typedef struct list_node<T> Node;
////
////		Node* _node;
////
////		list_terator(Node* node)
////			:_node(node)
////		{}
////
////		T& operator*()
////		{
////			return _node->_data;
////		}
////
////		bool operator==(const list_terator<T>& it)
////		{
////			return _node == it._node;
////		}
////
////		list_terator<T>& operator++()
////		{
////			_node = _node->_next;
////			return *this;
////		}
////
////		bool operator!=(const list_terator<T>& it)
////		{
////			return _node != it._node;
////		}
////
////	};
////
////	
////	template <class T>
////	class list
////	{
////	public:
////		typedef struct list_node<T> Node;
////		typedef list_terator<T> iterator;
////
////
////		list()
////		{
////			_head =  new Node;
////			_head->_next = _head;
////			_head->_prev = _head;
////		}
////
////		iterator begin()
////		{
////			return iterator(_head->_next);
////		}
////
////		iterator end()
////		{
////			return iterator(_head);
////		}
////
////		void push_back(const T& x)
////		{
////			Node* newnode = new Node(x);
////
////			Node* tail = _head->_prev;
////			newnode->_prev = tail;
////			tail->_next = newnode;
////			newnode->_next = _head;
////			_head->_prev = newnode;
////		}
////
////		~list()
////		{
////
////		}
////
////	private:
////		Node* _head;
////	};
////}
//
//namespace WX
//{
//	template <class T>
//	struct list_node
//	{
//		struct list_node* _next;
//		struct list_node* _prev;
//		T _data;
//
//		list_node(const T& x = T())
//			:_next(nullptr)
//			,_prev(nullptr)
//			,_data(x)
//			{}
//	};
//
//	template <class T, class ref, class ptr>
//	struct list_iterator
//	{
//		typedef list_node<T> Node;
//		typedef list_iterator< T, ref, ptr> self;
//
//		Node* _node;
//
//		list_iterator(Node* node)
//			:_node(node)
//		{}
//
//
//		ref operator*()
//		{
//			return _node->_data;
//		}
//
//		ptr operator->()
//		{
//			return &_node->_data;
//		}
//
//	};
//
//	template <class T>
//	class list
//	{
//	public:
//		typedef list_node<T> Node;
//		typedef list_iterator<T, T&, T*> iterator;
//		typedef list_iterator<T, const T&, const T*> const_iterator;
//
//		iterator begin()
//		{
//			return iterator(_head->_next);
//		}		
//		
//		iterator end()
//		{
//			return iterator(_head);
//		}
//
//		const_iterator begin() const
//		{
//			return const_iterator(_head->_next);
//		}		
//		
//		const_iterator end() const
//		{
//			return const_iterator(_head);
//		}
//
//		list()
//		{
//			_head = new Node;
//			_head->_next = _head;
//			_head->_prev = _head;
//		}
//
//		void push_back(const T& x)
//		{
//			Node* newnode = new Node(x);
//
//			Node* tail = _head->_prev;
//			newnode->_prev = tail;
//			tail->_next = newnode;
//			newnode->_next = _head;
//			_head->_prev = newnode;
//
//		}
//
//
//	private:
//		Node* _head;
//
//	};
//
//}